ヘッダーをスキップ
Oracle TimesTen In-Memory Database C開発者およびリファレンス・ガイド
リリース7.0
E05164-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

データ・ストアに対する接続および切断

TimesTenデータ・ストアにDSNを作成する方法の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』を参照してください。作成するDSNのタイプは、アプリケーションがデータ・ストアに、直接接続するか、クライアント接続するかによって異なります。データ・ストアに直接接続する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のUNIXでのDSNの作成またはWindowsでのDSNの作成に関する項を参照してください。データ・ストアにクライアント接続する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のWindowsでのクライアントDSNの作成および設定またはUNIXでのクライアントDSNの作成および設定に関する項を参照してください。

データ・ストアに接続するには、ODBC機能のSQLConnectまたはSQLDriverConnectをコールします。データ・ストアから切断するには、ODBC機能のSQLDisconnectをコールします。これらの機能の詳細は、『Microsoft ODBC Programmer's Reference and SDK Guide』を参照してください。

例1.1のコード・フラグメントでは、SQLConnectおよびSQLDisconnectを起動して、FixedDsというデータ・ストアに対する接続および切断を行います。アプリケーションではじめてSQLConnectを起動すると、データ・ストアFixedDs が作成されます。その後SQLConnectを起動すると、既存のデータ・ストアに接続されます。

例1.1

#include <sql.h>

SQLRETURN   retcode;

SQLHDBC     hdbc;

...;

retcode = SQLConnect(hdbc,

                     (SQLCHAR*)"FixedDs", SQL_NTS,

                     (SQLCHAR*)"", SQL_NTS,

                     (SQLCHAR*)"", SQL_NTS);

...;

retcode = SQLDisconnect(hdbc);

...;

例1.2

この例には、データ・ストアを作成し、データ・ストアに対して接続および切断を行う完全なプログラムが含まれています。この例では、SQLConnectではなく、SQLDriverConnectを使用して接続を設定します。また、エラー・メッセージの取得方法についても示します。

#ifdef WIN32

#include <windows.h>

#else

#include <sqlunix.h>

#endif

#include <sql.h>

#include <sqlext.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

void CheckReturnCode(SQLRETURN rc, SQLHENV henv,

                SQLHDBC hdbc, SQLHSTMT hstmt,

                char* msg, char *filename,

                int lineno);

void main( void )

{

  SQLRETURN rc = SQL_SUCCESS;

            /* General return code for the API */

  SQLHENV hEnv = SQL_NULL_HENV;

                         /* Environment handle */

  SQLHDBC hDbc = SQL_NULL_HDBC;

                         /* Connection handle */

  SQLHSTMT hStmt = SQL_NULL_HSTMT;

                         /* Statement handle */

  SQLCHAR ConnOut[255];

     /* Buffer for completed connection string */

  SQLSMALLINT connOutLen;

     /* number of bytes returned in ConnOut */

  SQLCHAR *ConnString = (SQLCHAR *)                 "DSN=OperationalDS;PermSize=32;"

                     /* Connection attributes */

  rc = SQLAllocEnv(&hEnv);

  if (rc != SQL_SUCCESS) {

    fprintf(stderr,"Unable to allocate an "                    "environment handle\n");

    exit(1);

  }

  rc = SQLAllocConnect(hEnv, &hDbc);

  CheckReturnCode(rc, hEnv, SQL_NULL_HDBC,

                  SQL_NULL_HSTMT,

                  "Unable to allocate a "

                  "connection handle\n",
                  __FILE__, __LINE__);

  rc = SQLDriverConnect(hDbc, NULL,

                        ConnString, SQL_NTS,

                        ConnOut, 255,

                        &connOutLen,

                        SQL_DRIVER_NOPROMPT);

  CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT,

                  "Error in connecting to the"

                  " driver\n",

                  __FILE__, __LINE__);

  rc = SQLAllocStmt(hDbc, &hStmt);

  CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT,

                  "Unable to allocate a "

                  "statement handle\n",

                  __FILE__,__LINE__);

    /* Your application code here */

  if (hStmt != SQL_NULL_HSTMT) {

    rc = SQLFreeStmt(hStmt, SQL_DROP);

    CheckReturnCode(rc, hEnv, hDbc, hStmt,

                    "Unable to free the "

                    "statement handle\n",

                    __FILE__, __LINE__);

  }

  if (hDbc != SQL_NULL_HDBC) {

    rc = SQLDisconnect(hDbc);

    CheckReturnCode(rc, hEnv, hDbc,

                    SQL_NULL_HSTMT,

                    "Unable to close the "

                    "connection\n",

                    __FILE__, __LINE__);

    rc = SQLFreeConnect(hDbc);

    CheckReturnCode(rc, hEnv, hDbc,

                    SQL_NULL_HSTMT,

                    "Unable to free the "

                    "connection handle\n",

                    __FILE__, __LINE__);

  }

  if (hEnv != SQL_NULL_HENV) {

    rc = SQLFreeEnv(hEnv);

    CheckReturnCode(rc, hEnv, SQL_NULL_HDBC,

                         SQL_NULL_HSTMT,

                         "Unable to free the "                          "environment handle\n",

                         __FILE__, __LINE__);

  }

}

void CheckReturnCode(SQLRETURN rc, SQLHENV henv,

                SQLHDBC hdbc, SQLHSTMT hstmt,

                char* msg, char *filename,

                int lineno)

{

#define MSG_LNG 512

  SQLCHAR szSqlState[MSG_LNG];

             /* SQL state string */

  SQLINTEGER pfNativeError;

             /* Native error code */

  SQLCHAR szErrorMsg[MSG_LNG];

             /* Error msg text buffer pointer */

  SQLSMALLINT pcbErrorMsg;

             /* Error msg text Available bytes */

  SQLRETURN ret = SQL_SUCCESS;

  if (rc != SQL_SUCCESS &&

      rc != SQL_NO_DATA_FOUND ) {

    if (rc != SQL_SUCCESS_WITH_INFO) {

      /*

       * It's not just a warning

      */

      fprintf(stderr, "*** ERROR in %s, line %d:"

                      " %s\n",

                      filename, lineno, msg);

    }

    /*

     * Now see why the error/warning occurred

    */

    while (ret == SQL_SUCCESS ||

           ret == SQL_SUCCESS_WITH_INFO) {

      ret = SQLError(henv, hdbc, hstmt,

                     szSqlState, &pfNativeError,

                     szErrorMsg, MSG_LNG,

                     &pcbErrorMsg);

      switch (ret) {

        case SQL_SUCCESS:

          fprintf(stderr, "*** %s\n"

                  "*** ODBC Error/Warning = %s, "

                  "TimesTen Error/Warning "

                  " = %d\n",

                  szErrorMsg, szSqlState,

                  pfNativeError);

          break;

        case SQL_SUCCESS_WITH_INFO:

          fprintf(stderr, "*** Call to SQLError"

                  " failed with return code of "

                  "SQL_SUCCESS_WITH_INFO.\n "

                  "*** Need to increase size of"

                  " message buffer.\n");

          break;

        case SQL_INVALID_HANDLE:

          fprintf(stderr, "*** Call to SQLError"

                  " failed with return code of "

                  "SQL_INVALID_HANDLE.\n");

          break;

        case SQL_ERROR:

          fprintf(stderr, "*** Call to SQLError"

                  " failed with return code of "

                  "SQL_ERROR.\n");

          break;

        case SQL_NO_DATA_FOUND:

          break;

      } /* switch */

    } /* while */

};